
package br.com.petshop.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Sidney
 * @version 1.0
 */
public abstract class GenericDAO {
    
    public Connection getConnection(){
        try{
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/petshop","root","root");
            return con;
        }catch(Exception e){
            e.printStackTrace();
            return null;
        }        
    }
    public Statement getStatement(){
        try {//metodo lanca excecao verificada, neste caso preferi tratar a excecao ao inves de apenas lancar
            return getConnection().createStatement();
        } catch (SQLException ex) {
            Logger.getLogger(GenericDAO.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
    public PreparedStatement getStatement(String pst){
        try {//metodo lanca excecao verificada, neste caso preferi tratar a excecao ao inves de apenas lancar
            return getConnection().prepareStatement(pst);
        } catch (SQLException ex) {
            Logger.getLogger(GenericDAO.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
    /**
     * Este metodo do tipo ResultSet executara as queries que forem passadas, tera dois argumentos, um do tipo 
     * String que representa a querie e outro um var arg de Object.
     */
    public ResultSet executeQuery(String query, Object... params)throws SQLException{
        PreparedStatement ps = getStatement(query);
        for(int i = 0; i < params.length; i++){//no primeiro teste realizado esta linha apresentava
            //problemas porque o indice tem que ser menor que o tamanho dos parametros e nao <=.
            ps.setObject(i + 1,params[i]);
        }
        return ps.executeQuery();
        
    }
    
    public Object executeCommand(String query, Object... params )throws SQLException{
        PreparedStatement ps = getStatement(query);
        for (int i = 0; i < params.length; i++) {
            ps.setObject(i + 1, params[i]);
        }
         return ps.executeUpdate();     
    }
    
    //este metodo sera chamado no metodo para adicionar usuario, faz uma verificacao se o ID ja esxiste no banco
    public Integer getNextId(String tablename) throws SQLException{
        ResultSet rs = executeQuery("SELECT MAX(Id) from petshop." + tablename );
        rs.next();
        Object result = rs.getObject(1);
        if(result == null){
            rs.close();
            return 1;
        }else{
            return ((Integer)result) + 1;
        }
        
    }
}
